#include <func.h>
#include "queue.h"

typedef struct status_s{

    int num; // 子线程的个数
    pthread_t * thread_ids;// 线程的id

    queue_t queue;
    
    pthread_mutex_t lock;
    pthread_cond_t cond;

    int exit_flag;// 退出标记位: 0正常, 1要求退出 
}status_t;

typedef struct
{
    char user_name[20];//用户名
    char path[128];//路径:用户名之后的路径
    char arg[60];//存放参数，文件夹名，cd路径之类的数据
    char base_path[128];//基础路径：用户名之前的路径
} user_t;

enum
{
    LOGIN = 1,//登录
    REGISTER,//注册
    EXIT,//退出
    CD,//进入目录
    LS,//列出文件
    PUTS,//上传
    GETS,//下载
    RM,//删除
    PWD,//显示路径
    MKDIR//创建文件夹

};

typedef struct
{
    int cmd;//命令
    int arg_num;//参数个数
    char arg[1024];//参数
} portocol_t;

typedef enum {
    LOG_DEBUG,
    LOG_INFO,
    LOG_WARNINGS,
    LOG_ERROR
}LOG_GRADE_t;

void *thread_main(void *p);

// 初始化共享的数据
int init_status(status_t * status, int num);

// 启动子线程
int init_thread(status_t *status);

// 启动socket监听
int init_socket(int *socket_fd, char *port, char *ip);

// 添加epoll监听
int add_epoll(int epoll_fd, int fd);

// 和客户端进行通信
int do_worker(int net_fd);

//登录
int login(user_t* status,const portocol_t* portocol, int net_fd);

//注册
int regist(user_t* status,const portocol_t* portocol, int net_fd);

//解析stdin
int read_stdin(user_t* status, portocol_t* portocol, int net_fd);

//进入目录
int cd(user_t* status, const portocol_t* portocol, int net_fd);

//列出文件
int ls(const user_t* status, const portocol_t* portocol, int net_fd);

//上传
int upload(const user_t* status, const portocol_t* portocol, int net_fd);

//下载
int download(const user_t* status, const portocol_t* portocol, int net_fd);

//删除
int rm(const user_t* status, const portocol_t* portocol, int net_fd);

//删除目录
//int rm_dir(const user_t* status, const portocol_t* portocol, int net_fd);

//删除文件
//int rm_file(const user_t* status, const portocol_t* portocol, int net_fd);

//显示路径
int pwd(const user_t* status, const portocol_t* portocol, int net_fd);

//创建文件夹
int create_dir(const user_t* status, const portocol_t* portocol, int net_fd);

//读取配置文件
int getparameter(char* key, char* value);

//写日志
int WRITE_LOG(const LOG_GRADE_t log_grand,  char* remark);
